package com.xiaoluo.lottery.common.utils;

import com.xl.tool.redis.JedisResource;

import org.springframework.util.Assert;
import redis.clients.jedis.Jedis;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Project : lottery
 * Package : com.xiaoluo.lottery.common.utils
 * Created by Willian.
 * Date  : 2016/4/14 15:49.
 *
 * 微信红包发送规则
 * 1、发送频率规则
    ◆ 每分钟发送红包数量不得超过1800个；
    ◆ 同一个商户号，每分钟最多给同一个用户发送一个红包；
   2、红包规则
    ◆ 单个红包金额介于[1.00元，200.00元]之间；
    ◆ 同一个红包只能发送给一个用户；（如果以上规则不满足您的需求，请发邮件至wxhongbao@tencent.com获取升级指引）
    ◆ 红包发放后72小时未被领取将进行退款
 */
public class FrequencyUtil {
    //每分钟发送红包最大数量
    private final static Integer MAX_ON_MIN = 1800;
    //过期时间
    private final static Integer SECONDS = 60;
    //当前一分钟发送红包数量
    private static AtomicInteger current = new AtomicInteger(0);

    static {
        /**
         * 启动频率控制线程
         */
        new Thread(new FrequencyMonitor()).start();
    }

    /**
     * 计算是否容许发放红包
     * @param openId
     * @return
     */
    public static boolean can(String openId){

        Assert.notNull(openId);
        boolean result = false;

        //数量判断
        if(current.get()<MAX_ON_MIN){
            current.incrementAndGet();
            result = true;
        }
        //判断用户在同一分钟内是否有发送记录
        if(result){
            try {
                Jedis jedis = JedisResource.getInstance().get(false);
                Long ret = jedis.setnx(openId, openId);
                if(ret>0){
                    jedis.expire(openId,SECONDS);
                }else {
                    result = false;
                }
            }finally {
                JedisResource.getInstance().release();
            }
        }
        //返回结果
        return result;
    }


    /**
     * 频率监控线程
     */
    private static class FrequencyMonitor implements Runnable{
        private long start = System.currentTimeMillis();
        private  final static Integer MIN_SEC = 1000*SECONDS;

        @Override
        public void run() {

            while (true){
                //检查是否超过1分钟
                if(System.currentTimeMillis()-start>MIN_SEC){
                    start = System.currentTimeMillis();
                    current.set(0);
                }
                //sleep 1 min.
                //System.out.println("FrequencyMonitor sleep.");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


}
